package test.app.dao.hibernate;

import java.util.List;

import org.acegisecurity.userdetails.UserDetails;
import org.acegisecurity.userdetails.UserDetailsService;
import org.acegisecurity.userdetails.UsernameNotFoundException;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.ObjectRetrievalFailureException;

import test.app.dao.UsuarioDao;
import test.app.model.Usuario;


public class UsuarioDaoHibernate extends GenericDaoHibernate<Usuario, Long> implements UsuarioDao, UserDetailsService{

	public UsuarioDaoHibernate() {
        super(Usuario.class);
    }
		
	/**
	* Obtiene la informacion del login
	* @param username the user's username
	* @return userDetails populated userDetails object
	* @throws org.acegisecurity.userdetails.UsernameNotFoundException thrown when user not found in database
	*/
	@SuppressWarnings("unchecked")
	public UserDetails loadUserByUsername(String username)throws UsernameNotFoundException, DataAccessException {
		List<Usuario> usuarios = getHibernateTemplate().find("from Usuario u where u.username=?",username);
		if(usuarios == null || usuarios.isEmpty()){
			throw new UsernameNotFoundException("Usuario " + username + " no encontrado...");
		}else{
			return (UserDetails) usuarios.get(0);
		}
	}

	
	@SuppressWarnings("unchecked")
	public List<Usuario> getUsuarios() {
		return getHibernateTemplate().find("from Usuario u order by u.codUsuario");
	}


	public Usuario saveUsuario(Usuario usuario) {
		getHibernateTemplate().save(usuario);
		getHibernateTemplate().flush();
		return usuario;	
		
	}
	
	@SuppressWarnings("unchecked")
	public Usuario getUsuario(String username) {
		
		List<Usuario> usuarios = getHibernateTemplate().find("from Usuario u where u.username=?",username);
		
		if(usuarios == null || usuarios.isEmpty()){
			log.warn("usuario '" + username + "' no  Encontrado...");
			throw new ObjectRetrievalFailureException(Usuario.class, username);
		
		}else{
			return usuarios.get(0);
		}
	}
		
			
	public void removeUsuario(String username) {
		getHibernateTemplate().delete(getUsuario(username));
		
	}
	
	@Override
	public Usuario save(Usuario usuario) {
		return this.saveUsuario(usuario);
		
	}
	
	@SuppressWarnings("unchecked")
	
	/**
	 * Metodo para Paginacion
	 */
	public List<Usuario> getUsuarios(int page, int pageSize) {
		
		Query query = getSession().createQuery("from Usuario");
		return query.setFirstResult(page * pageSize).setMaxResults(pageSize + 1).list();
		
    }
    /**
     * Cuenta la cantidad de usuarios
     */
    public int getUsuarioCount(){
    	return ((Long) getSession().createQuery("select count(*) from Usuario").uniqueResult()).intValue();
    	
    }

	@Override
	public List<Usuario> findByCriteria(Criterion... criterion) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Usuario findById(Long id) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Usuario> getAll() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void remove(Long id) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void update(Usuario transientObject) {
		// TODO Auto-generated method stub
		
	}

	
    
	
	
}

